package com.tangtang.gulimall.product.Excepitonoption;

import com.tangtang.common.Vaildatoroption.BizCode;
import com.tangtang.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

/**
 * 这是扑捉商品表单校验提供的一个的类
 * 1)@ControllerAdvice（也可以替换成@RestControllerAdvice,自带返回的@ResponeseBody） 将controller的异常全部捕捉
 * 2)@ExceptionHandler(value= MethodArgumentNotValidException.class) 将扑捉的异常类进行分类,这里只获取表单校验错误的异常消息
 */

@RestControllerAdvice(basePackages = "com.tangtang.gulimall.product.controller")
//@ControllerAdvice(basePackages = "com.tangtang.gulimall.product.controller")
@Slf4j
public class GulimallExceptionControllerAdvice {
    //也可以返回总的Exception.class,这里是指定表单校验异常处理的机制
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handlerNotValidException(MethodArgumentNotValidException e)
    {
        log.error("数据校验出现的问题:{},出现的异常:{}"+e.getMessage(),e.getClass());
        //将表单的校验异常返回BindingResult来进行处理显示
        BindingResult result = e.getBindingResult();

        Map<String,String> map = new HashMap<>();
        //流遍历数据
        if(result.hasErrors())
        {
            result.getFieldErrors().forEach((item)->{
                //获取校验规则错误的属性
                String errorid = item.getField();
                //获取校验错误的提示消息
                String errormessage = item.getDefaultMessage();
                map.put(errorid,errormessage);
            });
        }
        //原来的传异常消息的处理方法
        //return R.error(400,"数据校验校验出现错误").put("data",map);
        //使用公共类中的枚举传参方法(这类方法是为了更好的返回状态码)
        return R.error(BizCode.VAILD_EXCEPTION.getCode(),BizCode.VAILD_EXCEPTION.getMessage()).put("data",map);
    }

    //可以处理所有的异常写法
    @ExceptionHandler(value = Throwable.class)
    public R GetAllExceptionHandler(Throwable throwable)
    {
        log.error("错误提示信息："+throwable);
        //Throwable获取所有的异常进行处理
        return R.error(BizCode.UNKOW_EXCEPTION.getCode(),BizCode.UNKOW_EXCEPTION.getMessage());//都进行一个异常处理提示
    }
}
